function output = my_setNaN(input,mask,option)
% output = my_setNaN(input,mask)
%
% --------自定义函数--------
% 函数名称：my_setNaN
% 函数说明：根据mask设置缺失值,mask是0,1构成的2维掩膜
% 函数输入：input,arg
%   input： 需要处理的数据（1-3维都可）
%   mask： 可选参数,[0,1]构成，如果是0，那么就是将0设为nan，如果是mask，就是按照mask设
%       nan
%   可选参数：
%       "NaNTag" NaN|NaT|0
% 函数输出：output
% 作者：sid
% LOG：
%    2021/11/11 ver 1.0 : create
%   
% 备注：mask文件是不能有nan值的。有nan值会影响mask做索引
arguments
    input
    mask = 0
    option.NaNTag {mustBeMissing(option.NaNTag)} = NaN
end

switch judgeType(mask)
case 1
    output = double(input);
    output(input == mask) = option.NaNTag;
case 2  
    switch ndims(input)
    case 2
        output = double(input) .* my_setNaN(mask,'NaNTag',option.NaNTag);
    case 3
        [output,SIZE] = my_shiftdim(input, 1);
        output(:,~logical(mask(:))) = option.NaNTag;
        output = my_shiftdim(output,2,SIZE);
    end
end

end

function type = judgeType(input)
    % 判断输入是矩阵还是单个值
    if numel(input) == 1
        type = 1;
    else
        type = ndims(input);
    end
end

function mustBeMissing(Value)
    ErrorMs = 'NaNTag 必须是{0，NaN, NaT}三个中的一个';
    if isdatetime(Value) && isnat(Value)
        true;
    elseif isdatetime(Value)
        error(ErrorMs);
    elseif isnan(Value)
        true;
    elseif Value == 0
        true;
    else
        error(ErrorMs);
    end
end